// AC
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;

int mark[60][60];
int room[60][60];
int n, m, num = 0, area, maxarea;
struct data
{
    int x, y;
    data(int x, int y) : x(x), y(y) {}
};

void dfs(int x, int y)
{
    stack<data> stk;
    data p, pp;
    p.x = x;
    p.y = y;
    stk.push(p);
    while (!stk.empty())
    {
        p = stk.top();
        if (mark[p.x][p.y])
            stk.pop();
        else
        {
            ++area;
            mark[p.x][p.y] = 1;
            if ((room[p.x][p.y] & 1) == 0 && p.y > 0 && !mark[p.x][p.y - 1])
            {
                pp.x = p.x;
                pp.y = p.y - 1;
                stk.push(pp);
            }
            if ((room[p.x][p.y] & 2) == 0 && p.x > 0 && !mark[p.x - 1][p.y])
            {
                pp.x = p.x - 1;
                pp.y = p.y;
                stk.push(pp);
            }
            if ((room[p.x][p.y] & 4) == 0 && p.y + 1 < n && !mark[p.x][p.y + 1])
            {
                pp.x = p.x;
                pp.y = p.y + 1;
                stk.push(pp);
            }
            if ((room[p.x][p.y] & 8) == 0 && p.x + 1 < m && !mark[p.x + 1][p.y])
            {
                pp.x = p.x + 1;
                pp.y = p.y;
                stk.push(pp);
            }
        }
    }
}
int main()
{
    while (scanf("%d%d", &m, &n) != EOF)
    {
        maxarea = 0;
        memset(mark, 0, sizeof(mark));
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                scanf("%d", &room[i][j]);
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (!mark[i][j])
                {
                    area = 0;
                    ++num;
                    dfs(i, j);
                    if (area > maxarea)
                        maxarea = area;
                }
            }
        }
        printf("%d\n%d\n", num, maxarea);
    }
    return 0;
}